package movepaint.view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import java.util.ArrayList;
import movepaint.GestureRecognition;

/**
 * Classe qui affiche la barre des couleurs de l'application.
 * @author Paulino A.
 * @version 1.0
 */
public class ToolBarCouleurs extends JToolBar {
    // reference a la frame principale
    private GestureRecognition _frameMain = null;

    // List default color
    ArrayList<Color> listColor = null;

    //	Tooltip pour chaque icone
    private static final String TOOLTIP_COULEUR = "CTRL + clique gauche pour personnaliser la couleur";
    private static final String TOOLTIP_FONCTIONNEMENT = "Clique gauche : Remplissage | Clique droit : Bordure";

    // Boutons associes a la toolbar
    private JButton _selectedColor = null;

    // panel des couleurs
    private JPanel _panelCouleurs = null;

    /**
     *	Constructeur qui creer la barre de couleur
     *
     *	@param frameMain
     *			Reference a la frame principale
     **/
    public ToolBarCouleurs(GestureRecognition frameMain) {
        super("Couleurs", HORIZONTAL);

        // Reference a la frame principale
        _frameMain = frameMain;

        setRollover(true);

        // On definit les parametres de la toolBar
        setFloatable(true);

        // On creer les composants
        createComponents();

        // On place les composants
        placeComponents();
    }

    /**
     *	Cette methode creer les composants de la fenetre
     */
    private void createComponents() {
        // Bouton qui représente la couleur choisie
        _selectedColor = new JButton();
        _selectedColor.setBackground(Color.WHITE);
        _selectedColor.setToolTipText("Fond et bordure actuelle");
        _selectedColor.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        _selectedColor.setPreferredSize(new Dimension(25, 20));

        // On init les couleurs
        listColor = new ArrayList<Color>();
        listColor.add(Color.BLACK);
        listColor.add(Color.BLUE);
        listColor.add(Color.GRAY);
        listColor.add(Color.GREEN);
        listColor.add(Color.MAGENTA);
        listColor.add(Color.ORANGE);
        listColor.add(Color.PINK);
        listColor.add(Color.RED);
        listColor.add(Color.WHITE);
        listColor.add(Color.YELLOW);

        // On créer le panel des couleurs
        _panelCouleurs = new JPanel();
        _panelCouleurs.setLayout(new GridLayout(2, 5));
        ButtonGroup groupColor = new ButtonGroup();
        JButton src;
        for (int i = 0; i < 10; i++) {
            // On créer les couleurs
            src = new JButton();
            src.setToolTipText(TOOLTIP_COULEUR);
            src.setBackground(getColor(i));

            // création d'un event anonyme pour le choix et la personnalisation de la couleur
            src.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseEntered(MouseEvent e) {
                    _frameMain._statusBar.isWork(true);
                    _frameMain._statusBar.setStatusText(TOOLTIP_FONCTIONNEMENT);
                }
                @Override
                public void mouseExited(MouseEvent e) {
                    _frameMain._statusBar.isWork(false);
                }
                @Override
                public void mousePressed(MouseEvent e) {
                    JButton src = (JButton)e.getSource();

                    if (SwingUtilities.isLeftMouseButton(e) && e.isControlDown()) { /** Bouton Gauche + CTRL */
                        // Change the color of the shape
                        Color color = JColorChooser.showDialog(_frameMain, "Choisissez votre couleur", null);

                        if (color != null) {
                            src.setBackground(color);

                            // On met à jour la couleur des bordures
                            _selectedColor.setBorder(BorderFactory.createLineBorder(color));

                            // On met a jour la couleur dans la machine a état du panel de dessin
                            _frameMain.setBorderColor(color);
                        }
                    } else if (SwingUtilities.isRightMouseButton(e)) { /** Bouton DROIT */
                        // On met à jour la couleur des bordures
                        _selectedColor.setBorder(BorderFactory.createLineBorder(src.getBackground()));

                        // On met a jour la couleur dans la machine a état du panel de dessin
                        _frameMain.setBorderColor(src.getBackground());
                    } else if (SwingUtilities.isLeftMouseButton(e)) { /** Bouton GAUCHE */
                        // On met à jour la couleur de fond
                        _selectedColor.setBackground(src.getBackground());

                        // On met a jour la couleur dans la machine a état du panel de dessin
                        _frameMain.setBackgroundColor(src.getBackground());
                    }
                }
            });

            // On groupe la couleur
            groupColor.add(src);

            // On ajoute la couleur
            _panelCouleurs.add(src);
        }
    }


    /**
     * Méthode privée qui retourne la couleur par défaut à la position <i>i</i>
     * @param i Position de la couleur à retourner
     * @return  La couleur par défaut à la position <i>i</i>
     */
    private Color getColor(int i) {
        return listColor.get(i);
    }

    /**
     *	Cette methode place les composants de la fenetre
     */
    private void placeComponents() {
        // On ajoute le panel de couleur
        setLayout(new FlowLayout(FlowLayout.LEADING));
        add(_panelCouleurs);
        addSeparator();
        add(_selectedColor);
    }
}